package org.ch03.test06;

import java.util.ArrayList;
import java.util.List;

/**
 * 型变
 *      1)不变:赋值运行符左右两边的泛型必须一致
 *      <p>
 *      2)协变:子类型的泛型可以赋值给父类型的泛型 - 通配符
 *      语法：类 或 接口<? extends 父类> 对象 = new 类<子类>();
 *          例：List<? extends Animal> list = new ArrayList<Cat>() ;
 *      3)逆变:
 *
 * @author ZJL
 * @date 2025-03-27
 */
public class MainTest03 {

    public static void main(String[] args) {
        // 解决方法
        List<Dog> dogList = new ArrayList<>();
        dogList.add(new Dog());
        dogList.add(new Dog());
        dogList.add(new Dog());

        // 泛型的协变性 - 泛型父亲可以接受泛型子类
        // ? 表示未知类型，但可以确定要么是 Animal 类型，
        // 要么是 Animal 类型的子类
        List<? extends Animal> list = dogList;

        // 应用场景：泛型的集合作为生产者（即只从中读取数据，而不写入数据）时，用 extends 关键字

        System.out.println(list.size());

    }
}
